#include "time_impl.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos
{
    time_impl::time_impl()
    {
        memset( &m_tm, 0, sizeof( m_tm ) );
    }

    time_impl::~time_impl()
    {
        term();
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // 

    int time_impl::init()
    {
        int nRet = 0;
        return nRet;
    }

    int time_impl::term()
    {
        int nRet = 0;
        memset( &m_tm, 0, sizeof( m_tm ) );
        return nRet;
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // 

    // 
    // calculate time difference. unit : 1 / 1000 second
    // 
    int time_impl::diffrent( i_time * pLastTime, xos_u32 * lpulDif )
    {
        int nRet = 0;

        time_impl * pImpl = static_cast< time_impl * >( pLastTime );

        if( !lpulDif || !pLastTime )
        {
            nRet = 1;
        }

        if( 0 == nRet )
        {
            LARGE_INTEGER l_cur = { 0 }, l_last = { 0 };
            FILETIME cur = { 0 }, last = { 0 };

            SystemTimeToFileTime( &pImpl->m_tm, &last );
            SystemTimeToFileTime( &m_tm, &cur );

            l_last.HighPart = last.dwHighDateTime;
            l_last.LowPart = last.dwLowDateTime;

            l_cur.HighPart = cur.dwHighDateTime;
            l_cur.LowPart = cur.dwLowDateTime;

            *lpulDif = ( xos_u32 )( ( l_cur.QuadPart - l_last.QuadPart ) / 10000 );
        }

        return nRet;
    }

    int time_impl::get_milli_second()
    {
        int nRet = m_tm.wMilliseconds;
        return nRet;
    }

    // 
    // update time
    // 
    int time_impl::get_time()
    {
        int nRet = 0;

        GetLocalTime( &m_tm );

        return nRet;
    }

    // 
    // get time details
    // 
    int time_impl::get_year()
    {
        int nRet = m_tm.wYear;
        return nRet;
    }

    int time_impl::get_month()
    {
        int nRet = m_tm.wMonth;
        return nRet;
    }

    int time_impl::get_day()
    {
        int nRet = m_tm.wDay;
        return nRet;
    }

    int time_impl::get_hour()
    {
        int nRet = m_tm.wHour;
        return nRet;
    }

    int time_impl::get_minute()
    {
        int nRet = m_tm.wMinute;
        return nRet;
    }

    int time_impl::get_second()
    {
        int nRet = m_tm.wSecond;
        return nRet;
    }

    // 
    // release
    // 
    int time_impl::release()
    {
        int nRet = 0;

        term();
        put_back_lock();

        return nRet;
    }
} // xos
